home *** CD-ROM | disk | FTP | other *** search
/ NeXT Education Software Sampler 1992 Fall / NeXT Education Software Sampler 1992 Fall.iso / Programming / Source / Car / Cycle.m < prev    next >
Encoding:
Text File  |  1992-06-15  |  2.3 KB  |  127 lines

  1.  
  2. /* Generated by Interface Builder */
  3.  
  4. #import <objc/Storage.h>
  5. #import "Car_main.h"
  6. #import "Cycle.h"
  7. #import "DataView.h"
  8. #import <appkit/nextstd.h>
  9.  
  10. @implementation Cycle
  11.  
  12. - init
  13. {
  14.     [super init];
  15.     cycle = self;
  16.     timeStep = 1;
  17.     return self;
  18. }
  19.  
  20. - data
  21. {
  22.     return data;
  23. }
  24.  
  25. - loadCycleFromStream:(NXStream *)stream
  26. {
  27. struct plotData point;
  28.  
  29.     if ( !data )
  30.         data = [[Storage alloc] initCount:0
  31.                     elementSize:sizeof(struct plotData)
  32.                                 description:PLOTDATA_DESCRIPTION];
  33.     else
  34.         [data empty];
  35.     while ( !NXAtEOS(stream) )
  36.         {
  37.         NXScanf(stream,"%f,%f\n",&point.x,&point.y);
  38.         [data addElement:&point];
  39.         }
  40.     return self;
  41. }
  42.  
  43. - (float)end
  44. {
  45.     return end;
  46. }
  47.  
  48. - setEnd:(float)aNumber
  49. {
  50.     end = MIN(aNumber,length);
  51.     return self;
  52. }
  53.  
  54. - (float)length
  55. {
  56.     return length;
  57. }
  58.  
  59. - setLength:(float)aNumber
  60. {
  61.     length = aNumber;
  62.     return self;
  63. }
  64.  
  65. - (float)start
  66. {
  67.     return start;
  68. }
  69.  
  70. - setStart:(float)aNumber
  71. {
  72.     start = MAX(aNumber,0);
  73.     return self;
  74. }
  75.  
  76. - reset
  77. {
  78.     presentTime = start;
  79.     return self;
  80. }
  81.  
  82. - getNextVelocity:(float *)velocity andAcceleration:(float *)acceleration
  83. {
  84. struct plotData *points;
  85. int after;
  86. int before;
  87. int count;
  88.  
  89.     count = [data count];
  90.     points = (struct plotData *)data->dataPtr;    
  91.  
  92.     if ( presentTime > points[count-1].x || presentTime > end )    // Signal the end of the cycle if there is no more data.
  93.         return nil;                        // or if we have reached the end.
  94.  
  95.     for ( after = 0 ; points[after].x < presentTime ; after++ );
  96.  
  97.     if ( points[after].x == presentTime )            // We want a middle derivative
  98.         after = after++;
  99.  
  100.     after = MIN(after,count-1);                    // Check to see that we don't go beyond the data
  101.  
  102.     for ( before = after -1 ; before >= 0 && points[before].x >= presentTime ; before-- );
  103.  
  104.     before = MAX(before,0);                    // Check to see that we don't go beyond the data.
  105.       
  106.     *acceleration = ( points[after].y - points[before].y ) / ( points[after].x - points[before].x );
  107.     
  108.     *velocity = points[before].y + ( presentTime - points[before].x ) * *acceleration;
  109.  
  110.     lastTime = presentTime;
  111.     presentTime += 1.0;                        //Advance the current state
  112.     return self;
  113. }
  114.  
  115. - (float)lastTime
  116. {
  117.     return lastTime;
  118. }
  119.  
  120. - (float)timeStep;
  121. {
  122.     return timeStep;
  123. }
  124.  
  125. @end
  126.  
  127.